﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.DAO;
using HerGoS.Viaticos.Entities;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Entities;
using HerGoS.Administration.Engine;
using HerGoS.Viaticos.Exceptions;

namespace HerGoS.Viaticos.Engine
{
    public class GestorDistancia
    {
        public static Distancia Obtener(int oid)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "DISTANCIAS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", oid);
                DataTable dt = repo.ExecuteDataTable();
                Distancia result = dt.ToGenericList<Distancia>(DistanciaConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new DistanciaGetException(ex);
            }
        }

        public static void Guardar(Distancia distancia)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryViaticosName);
                repo.Nombre = "DISTANCIAS_PROC";
                repo.AddParameter("@ACCION ", distancia.Persistencia);
                repo.AddParameter("@ID", distancia.OID);
                repo.AddParameter("@CODIGO", distancia.Codigo);
                repo.AddParameter("@DESCRIPCION", distancia.Descripcion);
                repo.AddParameter("@ORDEN", distancia.Orden);// no lo toma en cuenta yet.
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                distancia.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                GestorBitacora.Guardar(distancia);

            }
            catch (Exception ex)
            {
                throw new GastosSaveException(ex);
            }
        }

       public static void Eliminar(Distancia distancia)
       {
           distancia.Persistencia = EstadoPersistencia.DELETE;
           Guardar(distancia);
           distancia.Persistencia = EstadoPersistencia.UPDATE;
           distancia.Activo = false;
       }


       public static void ReActivar(Distancia distancia)
       {
           distancia.Persistencia = EstadoPersistencia.UNDELETE;
           Guardar(distancia);
           distancia.Persistencia = EstadoPersistencia.UPDATE;
           distancia.Activo = true;
       }


       public static List<Distancia> Consultar(string codigo, string descripcion, bool? activo)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
               repo.Nombre = "DISTANCIAS_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@DESCRIPCION", descripcion);
               repo.AddParameter("@ACTIVO", activo);
               DataTable dt = repo.ExecuteDataTable();
               List<Distancia> result = dt.ToGenericList<Distancia>(DistanciaConverter);
               return result;
           }
           catch (Exception ex)
           {
               throw new DistanciaGetException(ex);
           }
       }

       /// <summary>
       /// Permite consultar las distancias   /// </summary>
       /// <returns>Todos las distancias</returns>
       public static List<Distancia> Consultar()
       {
           return Consultar(null, null, null);
       }




        #region Converter

        public static Distancia DistanciaConverter(DataRow row)
        {
            Distancia distancia = new Distancia
            {
                OID = row["disID"].ToInteger(),
                Persistencia = EstadoPersistencia.UPDATE,
                Codigo = row["disCODIGO"].ToString(),
                Descripcion = row["disDESCRIPCION"].ToString(),
                Orden = row["disORDEN"].ToInteger(),
                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };

            return distancia;
        }
        #endregion

    }
}
